Oracle RMAN WINDOWS 备份脚本
1 推荐的 RMAN 配置项
你可以通过以下命令在 RMAN 中逐条执行,或写入脚本文件:
rman target /
# 1️⃣ 保留策略:保留 14 天内可恢复(常规推荐)
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
# (可选)或者只保留最近 2 个全备(Redundancy)
-- CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
# 2️⃣ 控制文件自动备份(强烈建议开启)
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'D:\rman\backups\ctl_auto_%F.ctl';
# 3️⃣ 备份压缩(节省空间,建议开启)
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO COMPRESSED BACKUPSET;
# 4️⃣ 默认备份路径(建议指定固定路径)
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'D:\rman\default_%d_%U.bkp';
# 5️⃣ 自动通道释放,避免占用资源
--CONFIGURE DEVICE TYPE DISK CLEAR; -- 确保使用脚本中的 allocate/release 模式
# 6️⃣ 设置恢复目录连接(如有)
-- CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\oracle_backups\snapcf_ORCL.f';
# 7️⃣ 清除默认备份策略(如你使用脚本中自定义 format)
-- CONFIGURE CHANNEL DEVICE TYPE DISK CLEAR;
2 查看当前 RMAN 配置
你可以通过以下命令查看当前配置:
rman target /
SHOW ALL;
3 可选:启用块级校验(增强一致性检查)
CONFIGURE BACKUP OPTIMIZATION ON;
这样如果你做了重复内容的增备,RMAN 会跳过没变化的块。
4 关于 delete obsolete
生效条件
它依据你上面设置的保留策略(retention policy):
-
如果设置了
RECOVERY WINDOW OF 14 DAYS
,那delete obsolete
会删除那些 超过 14 天 且 不再需要恢复的备份。 -
配合
crosscheck backup
确保信息更新。
5 小结:推荐配置组合
配置项 | 建议值 |
---|---|
保留策略 | TO RECOVERY WINDOW OF 7 DAYS (7天可恢复) |
控制文件自动备份 | ON + 指定文件名格式 |
备份压缩 | COMPRESSED BACKUPSET (节省空间) |
并行度 | PARALLELISM 1 (可根据 CPU 增加) |
默认路径/格式 | 建议明确路径,统一管理 |
自动释放通道 | 建议在脚本中 allocate/release;CONFIGURE DEVICE ... CLEAR |
如你有恢复目录(RMAN catalog)或使用 FRA(闪回恢复区),我也可以给出推荐策略。是否需要针对FRA场景或Data Guard 备库场景的配置补充?
以下是基于你要求的完整备份方案,适用于 Windows Server 2012 R2 + Oracle 11g,并包含:
- ✅ 使用
cmdfile
指定 RMAN 命令文件方式 - ✅
full_backup.bat
:执行 Level 0 全量备份 - ✅
incr_backup.bat
:执行 Level 1 差异增量备份 - ✅
delete_obsolete.bat
:自动清理过期备份 - ✅
restore_db.rman
:恢复整个数据库的 RMAN 脚本 - ✅ 日志记录与报错处理机制。
6 文件目录结构建议
D:\rman\
├── scripts\
│ ├── full_backup.bat
│ ├── incr_backup.bat
│ ├── delete_obsolete.bat
│ ├── full_backup.rman
│ ├── incr_backup.rman
│ ├── delete_obsolete.rman
│ └── restore_db.rman
├── backups\
├── logs\
│ └── *.log
7 脚本内容
7.1 full_backup.bat
(Level 0 全量备份)
@echo off
set ORACLE_SID=ORCL
set ORACLE_HOME=D:\app\product\11.2.0\dbhome_1
set PATH=%ORACLE_HOME%\bin;%PATH%
set TODAY=%date:~0,4%%date:~5,2%%date:~8,2%
set LOGFILE=D:\rman\logs\full_%TODAY%.log
echo [%date% %time%] Starting FULL backup >> %LOGFILE%
rman target / cmdfile=D:\rman\scripts\full_backup.rman log=%LOGFILE%
IF %ERRORLEVEL% NEQ 0 (
echo [%date% %time%] FULL backup FAILED >> %LOGFILE%
) ELSE (
echo [%date% %time%] FULL backup COMPLETED >> %LOGFILE%
)
7.2 full_backup.rman
run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
allocate channel c4 device type disk;
backup incremental level 0 tag 'FULL_BACKUP'
format 'D:\rman\full\full_%d_%T_%U.bkp' database;
backup current controlfile
format 'D:\rman\full\ctl_%d_%T_%U.ctl';
backup archivelog all delete input
format 'D:\rman\full\arch_%d_%T_%U.arc';
crosscheck backup;
CROSSCHECK ARCHIVELOG ALL;
delete noprompt obsolete;
DELETE EXPIRED BACKUP;
DELETE EXPIRED ARCHIVELOG ALL;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}
7.3 incr_backup.bat
(Level 1 差异增量备份)
@echo off
set ORACLE_SID=ORCL
set ORACLE_HOME=D:\app\product\11.2.0\dbhome_1
set PATH=%ORACLE_HOME%\bin;%PATH%
set TODAY=%date:~0,4%%date:~5,2%%date:~8,2%
set LOGFILE=D:\rman\logs\incr_%TODAY%.log
echo [%date% %time%] Starting INCREMENTAL backup >> %LOGFILE%
rman target / cmdfile=D:\rman\scripts\incr_backup.rman log=%LOGFILE%
IF %ERRORLEVEL% NEQ 0 (
echo [%date% %time%] INCREMENTAL backup FAILED >> %LOGFILE%
) ELSE (
echo [%date% %time%] INCREMENTAL backup COMPLETED >> %LOGFILE%
)
7.4 incr_backup.rman
run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
allocate channel c4 device type disk;
backup incremental level 1 tag 'INCR_BACKUP'
format 'D:\rman\incr\incr_%d_%T_%U.bkp' database;
backup current controlfile
format 'D:\rman\incr\ctl_%d_%T_%U.ctl';
backup archivelog all delete input
format 'D:\rman\incr\arch_%d_%T_%U.arc';
crosscheck backup;
CROSSCHECK ARCHIVELOG ALL;
delete noprompt obsolete;
DELETE EXPIRED BACKUP;
DELETE EXPIRED ARCHIVELOG ALL;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}
8 恢复脚本(用于全库恢复)
restore_db.rman
脚本文件内容。
startup mount;
run {
allocate channel c1 device type disk;
restore database;
recover database;
release channel c1;
}
alter database open resetlogs;
- 使用方式(手动运行)。
rman target / cmdfile=D:\oracle_backups\scripts\restore_db.rman
9 报错处理机制建议
常见错误及处理方法:
错误代码 | 说明 | 处理建议 |
---|---|---|
ORA-19809 | 无法写入备份文件(空间不足) | 检查磁盘空间,或删除旧备份 |
ORA-19504 | 设备拒绝访问 | 检查权限、路径是否存在 |
ORA-27037 | 无法打开文件 | 检查路径是否拼写正确 |
ORA-12560 | 监听器连接失败 | 确保监听器正常、ORACLE_SID 正确 |
你可以在 .bat
脚本中加入 %ERRORLEVEL%
判断是否成功,并邮件或事件记录等。
10 建议的备份调度策略(任务计划)
类型 | 执行频率 | 脚本文件 |
---|---|---|
全备(Level 0) | 每周日凌晨1点 | full_backup.bat |
增备(Level 1) | 每天凌晨2点 | incr_backup.bat |
使用“任务计划程序”配置自动运行即可。
11 项目打包
以下所有脚本包含在这个 [[rman.zip]] 中。请下载使用。